package br.com.games.pyx.mosaico;

import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.anddev.andengine.entity.sprite.TiledSprite;
import org.anddev.andengine.opengl.texture.Texture;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.content.Context;
import android.util.Log;
import br.com.games.pyx.singleton.FabricaRecursos;

public class CarregadorMosaicoAnimado {

	private MosaicoAnimado mosaico;
	private String nome;
	private ArrayList<ParteAnim> parts = new ArrayList<ParteAnim>();
	private String base;
	private int comprimentoCelulas;
	private int alturaCelulas;
	private Texture texture;
	
//	imagens.getTiles().get("l_"+parte.linha+"c_"+parte.coluna)
	
	public MosaicoAnimado carregarMosaico(String nome, Context context) {

		mosaico = null;
		this.nome = nome;
		
		SAXParser parser;
		try {
			parser = SAXParserFactory.newInstance().newSAXParser();
			String caminho = "mosaicos/" + nome + ".def";

			CarregadorXMLHandler handler = new CarregadorXMLHandler();

			parser.parse(context.getAssets().open(caminho), handler);

			return mosaico;

		} catch (Throwable e) {
			Log.e("Toupety", "ERROR", e);
		}
		
		return null;
	}

	class CarregadorXMLHandler extends DefaultHandler {

		@Override
		public void startElement(String uri, String localName, String tag,
				Attributes attributes) throws SAXException {

			if (tag.toUpperCase().equals("MOSAICOANIMADO")) {
				
				base = attributes.getValue("base");
				comprimentoCelulas = Integer.parseInt(attributes.getValue("comprimentoCelulas"));
				alturaCelulas = Integer.parseInt(attributes.getValue("alturaCelulas"));
				int linhas = Integer.parseInt(attributes.getValue("linhas"));
				int colunas = Integer.parseInt(attributes.getValue("colunas"));
				
				try {
					mosaico = new MosaicoAnimado(nome, linhas, colunas, comprimentoCelulas, alturaCelulas);
					
					texture = FabricaRecursos.get().getTexture("imagens/"+base);
					
				} catch (Exception e) {
					e.printStackTrace();
				}

			} else if (tag.toUpperCase().equals("CELULA")) {
				
				String nome=attributes.getValue("nome");
				int linha=Integer.parseInt(attributes.getValue("linhaDestino")); 
				int coluna=Integer.parseInt(attributes.getValue("colunaDestino")); 
				int animacao=Integer.parseInt(attributes.getValue("animacao"));

				try {
					ParteAnim p = parts.get(animacao);
					
					mosaico.addCelula(p, linha, coluna);

				} catch(Throwable e) {
					e.printStackTrace();
				}
			} else if (tag.equalsIgnoreCase("animacao")) {
				
				int linha=Integer.parseInt(attributes.getValue("linha")); 
				int coluna=Integer.parseInt(attributes.getValue("coluna"));
				int velocidade=Integer.parseInt(attributes.getValue("velocidade"));
				int quadros=Integer.parseInt(attributes.getValue("quadros"));
//				boolean repetir=paraBoolean(attributes.getValue("repetir"));
				String nome = attributes.getValue("animacao");
				
				ParteAnim p = new ParteAnim();
				p.duracao = velocidade;
				p.frames = new TextureRegion[quadros];
				
				int c = 0;
				for(int i = coluna; i < (quadros+coluna); i++) {
					p.frames[c] = new TextureRegion(texture, i*comprimentoCelulas, linha*alturaCelulas, comprimentoCelulas, alturaCelulas);
					c++;
				}
				
				parts.add(p);
			}

		}
		
		
		private boolean paraBoolean(String val) {
			if (val == null)
				return false;

			return val.equalsIgnoreCase("SIM") ? true : false;
		}

		@Override
		public void endElement(String uri, String localName, String tag)
				throws SAXException {
		}

	}
}
